package com.atguigu.DAO.impl;

import com.atguigu.utils.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public abstract class BaseDAO {
    //使用DbUtils操作数据库
//    private QueryRunner queryRunner=new QueryRunner();
    @Autowired
    private JdbcTemplate jdbcTemplate;
    /**
     update() 方法用来执行，Insert/update/Delete语句
     @return 如果返回-1,说明执行失败，返回其他表示影响的行数
     */
    public int update(String sql,Object ...args){

//        System.out.println("BaseDAO程序在["+Thread.currentThread().getName()+"]中");
//
//        Connection conn= JDBCUtils.getConnection();
//        try {
//            return queryRunner.update(conn,sql,args);
//        } catch (SQLException e) {
//            e.printStackTrace();
//            throw new RuntimeException(e);
//        }
        return jdbcTemplate.update(sql,args);
    }

    /**
     * 查询返回一个JavaBean的sql语句
     * @param type 返回的对象类型
     * @param sql   执行的sql语句
     * @param args  sql对于的参数值
     * @param <T>   返回类型的泛型
     * @return
     */
    public <T> T  queryForOne(Class<T> type,String sql,Object...args){
//        Connection conn=JDBCUtils.getConnection();
//        try {
//            return queryRunner.query(conn,sql,new BeanHandler<T>(type),args);
//        } catch (SQLException e) {
//            e.printStackTrace();
//            throw new RuntimeException(e);
//        }
        T object=null;
        try {
           object = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<T>(type), args);
        } catch (DataAccessException e) {
            e.printStackTrace();
        }
        return object;
    }

    /**
     * 查询返回多个JavaBean的sql语句
     * @param type 返回的对象类型
     * @param sql   执行的sql语句
     * @param args  sql对于的参数值
     * @param <T>   返回类型的泛型
     * @return
     */
    public <T>List<T> queryForList(Class<T> type,String sql,Object...args){
//        Connection conn=JDBCUtils.getConnection();
//        try {
//            return queryRunner.query(conn,sql,new BeanListHandler<T>(type),args);
//        } catch (SQLException e) {
//            e.printStackTrace();
//            throw new RuntimeException(e);
//        }
       return jdbcTemplate.query(sql,new BeanPropertyRowMapper<T>(type),args);
    }

    /**
     * 执行返回一行一列的sql语句
     * @param sql 执行的sql语句
     * @param args  sql对于的参数值
     * @return
     */
    public Object queryForSingleValue(String sql,Object ...args){
//        Connection conn=JDBCUtils.getConnection();
//        try {
//            return queryRunner.query(conn,sql,new ScalarHandler(),args);
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new RuntimeException(e);
//        }
       return jdbcTemplate.queryForObject(sql,Object.class,args);
    }

}
